<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   <title>Bob フィルタ</title>
   <link rel="stylesheet" type="text/css" href="../../avisynth.css">
   <link rel="stylesheet" type="text/css" href="../ja.css">
</head>
<body >
<h2>
<a NAME="Bob"></a>Bob
</h2>
<p><code>Bob </code>(<var>clip, float "b", float "c", float "height"</var>)
<p><code>Bob</code> はクリップを受け取って、Bob 方式によるインターレース解除を行います。Bob 方式では、ライン間を補間することによって、各フィールドをそれ自身がフレームとなるように拡大します。トップフィールドは、ボトムフィールドに比べて、ほんの少し上にずらされます。このため、実際に画像が上下に動いているようには見えないでしょう。しかし静止した場面では、補間によってもう一方のフィールドをあまり正確に再現できないため、「ゆらめく」ように見えるでしょう。
<p>このフィルタは、その肝となる補間作業に <a href="resize.htm"><code>BicubicResize</code></a> を使用します。<var>b</var> と <var>c</var> の値は、調整することができます。さらに <var>height</var> パラメータを使って、垂直解像度を変更することも可能です。
<p>Bob フィルタは、実際にフィールドの物理的な位置を移動させるわけではありません。ただフィールドを元々あった位置に戻すだけです。単に <tt><a href="separatefields.htm"><code>SeparateFields</code></a></tt>() でフィールドを分離すると、半分の高さのフレームが 2 つ得られます: 分離前のライン 0 は分離後のフレーム 0 の ライン 0 に、分離前のライン 1 は分離後のフレーム 1 のライン 0 になります。したがって、分離前のライン 0 とライン 1 は同じ位置になるのです！Bob は、さらに分離後のフレームを基本的に垂直方向に 2 倍にリサイズしますが、ちょうど元々あった位置に合わる形で、最初のフレームでは偶数ラインに対してオリジナルのラインを使用し、2 番目のフレームでは奇数ラインに対してオリジナルのラインを使用します。もし <a href="separatefields.htm"><code>SeparateFields</code></a>() の後に各フレームを垂直方向に 2 倍に拡大するなら、フィールドの物理的な位置が移動するため、正しい結果が得られないでしょう。
<p>概要:
<br>ライン 0o、1o、2o、3o、... がオリジナルのライン、0i、1i、2i、3i、... が補間されたラインであると仮定します。
<p>ソース
<table BORDER COLS=2 WIDTH="40%" >
<tr>
<td>ライン番号</td>

<td>フレーム 0</td>
</tr>

<tr>
<td>0)</td>

<td>0o</td>
</tr>

<tr>
<td>1)</td>

<td>1o</td>
</tr>

<tr>
<td>2)</td>

<td>2o</td>
</tr>

<tr>
<td>3)</td>

<td>3o</td>
</tr>
</table>

<p>フィールド分離後
<table BORDER COLS=3 WIDTH="40%" >
<tr>
<td>ライン番号</td>

<td>フレーム 0</td>

<td>フレーム 1</td>
</tr>

<tr>
<td>0)</td>

<td>0o</td>

<td>1o</td>
</tr>

<tr>
<td>1)</td>

<td>2o</td>

<td>3o</td>
</tr>
</table>

<p>縦に 2 倍に拡大
<table BORDER COLS=3 WIDTH="40%" >
<tr>
<td>ライン番号</td>

<td>フレーム 0</td>

<td>フレーム 1</td>
</tr>

<tr>
<td>0)</td>

<td>0o</td>

<td>1o</td>
</tr>

<tr>
<td>1)</td>

<td>1i</td>

<td>2i</td>
</tr>

<tr>
<td>2)</td>

<td>2o</td>

<td>3o</td>
</tr>

<tr>
<td>3)</td>

<td>3i</td>

<td>4i</td>
</tr>
</table>

<p>しかし、フィールドの物理的な位置が変化するため、これは間違いです。
<p>一方、Bob はこれを正しく行います
<table BORDER COLS=3 WIDTH="40%" >
<tr>
<td>ライン番号</td>

<td>フレーム 0</td>

<td>フレーム 1</td>
</tr>

<tr>
<td>0)</td>

<td>0o</td>

<td>0i</td>
</tr>

<tr>
<td>1)</td>

<td>1i</td>

<td>1o</td>
</tr>

<tr>
<td>2)</td>

<td>2o</td>

<td>2i</td>
</tr>

<tr>
<td>3)</td>

<td>3i</td>

<td>3o</td>
</tr>
</table>

<h4>オリジナルのフィールドを厳密に保持し、失われたラインを埋めるだけにするには</h4>
<pre>bob(0.0, 1.0)</pre>

<p>Bob(0.0, 1.0) は、RGB と YUY2 に関してはオリジナルのフィールドを保持します。YV12 に関しては輝度は保持しますが、色差は保持しません。

<p>b=0.0 かつ c=1.0 の場合のフィルタ係数は、x=1.0/2.0 なら 0、x=0 なら 1 となります。オリジナルのフィールド位置で起こる ±0.25 のシフトのどちらでも、もう一方のフィールドについては、x=0.5/1.5 タップに対して -1/8 5/8 5/8 -1/8 という係数を伴う非常に簡潔なキュービックフィルタになります。

<p>しかしながら、色差平面でのシフトは YV12 の場合は 0.125 だけなので、結局、タップが正確に同じ距離になりません。詳しくは、<a href="http://forum.doom9.org/showthread.php?p=826073#post826073">こちらの議論</a>を参照してください。

<p>
<p><kbd>原文 Date: 2007/03/10 22:35:42</kbd><br />
<kbd>日本語訳 $Date: 2008/06/22 07:41:10 $</kbd></p>
<form><input TYPE="Button" VALUE="戻る"
onClick="history.go(-1)"></form>
</body>
</html>
